#include "led_manager.h"

/**
 * 初始化LED相关IO口, 并使能时钟
 */
static void InitLedIo(void)
{
    GPIO_InitTypeDef gpio_init_struct;

    /*开启时钟*/
    LED0_GPIO_CLK_ENABLE(); /* LED0时钟使能 */
    LED1_GPIO_CLK_ENABLE(); /* LED1时钟使能 */
    LED2_GPIO_CLK_ENABLE(); /* LED2时钟使能 */

    /*GPIO初始化*/
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;   /* 推挽输出 */
    gpio_init_struct.Pull = GPIO_PULLUP;           /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */

    gpio_init_struct.Pin = LED0_GPIO_PIN;             /* LED0引脚 */
    HAL_GPIO_Init(LED0_GPIO_PORT, &gpio_init_struct); /* 初始化LED0引脚 */

    gpio_init_struct.Pin = LED1_GPIO_PIN;             /* LED1引脚 */
    HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct); /* 初始化LED1引脚 */

    gpio_init_struct.Pin = LED2_GPIO_PIN;             /* LED2引脚 */
    HAL_GPIO_Init(LED2_GPIO_PORT, &gpio_init_struct); /* 初始化LED2引脚 */

    /*设置GPIO初始化后的默认电平*/
    LED0(1); /* 关闭 LED0 */
    LED1(1); /* 关闭 LED1 */
    LED2(1); /* 关闭 LED2 */
}

/**
 * 控制LED0的亮灭状态
 *
 * @param state LED亮灭状态，COT_LED_ON为点亮，COT_LED_OFF为熄灭
 */
void CtrlLed0(cotLedState_e state)
{
    state == COT_LED_ON ? LED0(0) : LED0(1); /* LED0是低电平点亮 */
}

/**
 * 控制LED1的亮灭状态
 *
 * @param state LED亮灭状态，COT_LED_ON为点亮，COT_LED_OFF为熄灭
 */
void CtrlLed1(cotLedState_e state)
{
    state == COT_LED_ON ? LED1(0) : LED1(1); /* LED1是低电平点亮 */
}

/**
 * 控制LED2的亮灭状态
 *
 * @param state LED亮灭状态，COT_LED_ON为点亮，COT_LED_OFF为熄灭
 */
void CtrlLed2(cotLedState_e state)
{
    state == COT_LED_ON ? LED2(0) : LED2(1); /* LED2是低电平点亮 */
}

/* LED模块初始化 */
void FML_LED_Init(void)
{
    static cotLedCfg_t s_ledTable[LED_MAX_NUM] =
        {
            {.pfnLedCtrl = CtrlLed0},
            {.pfnLedCtrl = CtrlLed1},
            {.pfnLedCtrl = CtrlLed2},
        };

    /* 初始化LED相关IO口 */
    InitLedIo();

    /* 初始化LED控制模块 */
    cotLed_Init(s_ledTable, LED_MAX_NUM);
}
